import 'dart:async';
import 'package:flutter/services.dart';
import 'sms_permissions.dart';

/// 短信发送模式枚举
enum SmsSendMode {
  /// 后台直接发送模式（需要SEND_SMS权限）
  background,

  /// 系统短信界面发送模式（无需权限，弹出系统短信应用）
  systemIntent,
}

/// 短信发送结果
class SmsSendResult {
  /// 是否发送成功
  final bool isSuccess;

  /// 错误消息（发送失败时）
  final String? errorMessage;

  /// 发送模式
  final SmsSendMode mode;

  const SmsSendResult({
    required this.isSuccess,
    this.errorMessage,
    required this.mode,
  });

  /// 成功结果
  static SmsSendResult success(SmsSendMode mode) {
    return SmsSendResult(isSuccess: true, mode: mode);
  }

  /// 失败结果
  static SmsSendResult failure(SmsSendMode mode, String error) {
    return SmsSendResult(isSuccess: false, errorMessage: error, mode: mode);
  }

  @override
  String toString() {
    return 'SmsSendResult{isSuccess: $isSuccess, errorMessage: $errorMessage, mode: $mode}';
  }
}

/// 短信发送器类
///
/// 提供两种发送模式：
/// 1. 后台发送：直接通过系统API发送，需要SEND_SMS权限
/// 2. 系统界面发送：打开系统短信应用发送界面，无需权限
class SmsSender {
  /// Method Channel用于与Android原生代码通信
  static const MethodChannel _channel = MethodChannel('sms_listener');

  /// 构造函数
  SmsSender();

  /// 发送短信（后台模式）
  ///
  /// [phoneNumber] 接收者手机号码
  /// [message] 短信内容
  /// [requestPermissionIfNeeded] 是否在权限不足时自动请求权限（默认true）
  ///
  /// 返回值：SmsSendResult包含发送结果和详细信息
  Future<SmsSendResult> sendSmsBackground({
    required String phoneNumber,
    required String message,
    bool requestPermissionIfNeeded = true,
  }) async {
    try {
      // 检查权限
      bool hasPermission = await SmsPermissions.hasSmsSendPermission();

      if (!hasPermission && requestPermissionIfNeeded) {
        print('SMS发送权限不足，尝试请求权限...');
        hasPermission = await SmsPermissions.requestSmsSendPermission();
      }

      if (!hasPermission) {
        return SmsSendResult.failure(
          SmsSendMode.background,
          // '缺少SMS发送权限，无法后台发送短信',
          'Missing SMS send permission, cannot send SMS in background',
        );
      }

      // 验证参数
      if (phoneNumber.trim().isEmpty) {
        return SmsSendResult.failure(
          SmsSendMode.background,
          // '手机号码不能为空',
          'Phone number cannot be empty',
        );
      }

      if (message.trim().isEmpty) {
        return SmsSendResult.failure(
          SmsSendMode.background,
          // '短信内容不能为空',
          'SMS content cannot be empty',
        );
      }

      // 调用原生方法发送短信
      final bool result = await _channel.invokeMethod('sendSmsBackground', {
        'phoneNumber': phoneNumber.trim(),
        'message': message,
      });

      if (result) {
        return SmsSendResult.success(SmsSendMode.background);
      } else {
        return SmsSendResult.failure(
          SmsSendMode.background,
          '短信发送失败，请稍后重试',
        );
      }
    } on PlatformException catch (e) {
      return SmsSendResult.failure(
        SmsSendMode.background,
        // '发送短信时发生错误: ${e.message}',
        'An error occurred while sending SMS: ${e.message}',
      );
    } catch (e) {
      return SmsSendResult.failure(
        SmsSendMode.background,
        // '发送短信时发生未知错误: $e',
        'An unknown error occurred while sending SMS: $e',
      );
    }
  }

  /// 发送短信（系统界面模式）
  ///
  /// [phoneNumber] 接收者手机号码（可选，为空时用户需在界面中输入）
  /// [message] 短信内容（可选，为空时用户需在界面中输入）
  ///
  /// 返回值：SmsSendResult包含操作结果
  Future<SmsSendResult> sendSmsWithSystemIntent({
    String? phoneNumber,
    String? message,
  }) async {
    try {
      // 调用原生方法打开系统短信界面
      final bool result = await _channel.invokeMethod('sendSmsWithIntent', {
        'phoneNumber': phoneNumber?.trim() ?? '',
        'message': message ?? '',
      });

      if (result) {
        return SmsSendResult.success(SmsSendMode.systemIntent);
      } else {
        return SmsSendResult.failure(
          SmsSendMode.systemIntent,
          // '无法打开系统短信发送界面',
          'Failed to open system SMS sending interface',
        );
      }
    } on PlatformException catch (e) {
      return SmsSendResult.failure(
        SmsSendMode.systemIntent,
        // '打开系统短信界面时发生错误: ${e.message}',
        'An error occurred while opening the system SMS sending interface: ${e.message}',
      );
    } catch (e) {
      return SmsSendResult.failure(
        SmsSendMode.systemIntent,
        // '打开系统短信界面时发生未知错误: $e',
        'An unknown error occurred while opening the system SMS sending interface: $e',
      );
    }
  }

  /// 发送短信（自动选择模式）
  ///
  /// 优先使用后台模式，如果权限不足则回退到系统界面模式
  ///
  /// [phoneNumber] 接收者手机号码
  /// [message] 短信内容
  /// [requestPermissionIfNeeded] 是否在权限不足时自动请求权限（默认true）
  /// [fallbackToIntent] 权限获取失败时是否回退到系统界面模式（默认true）
  ///
  /// 返回值：SmsSendResult包含发送结果和实际使用的模式
  Future<SmsSendResult> sendSms({
    required String phoneNumber,
    required String message,
    bool requestPermissionIfNeeded = true,
    bool fallbackToIntent = true,
  }) async {
    // 首先尝试后台发送
    final backgroundResult = await sendSmsBackground(
      phoneNumber: phoneNumber,
      message: message,
      requestPermissionIfNeeded: requestPermissionIfNeeded,
    );

    // 如果后台发送成功，直接返回结果
    if (backgroundResult.isSuccess) {
      return backgroundResult;
    }

    // 如果后台发送失败且允许回退，则尝试系统界面模式
    if (fallbackToIntent) {
      print('后台发送失败，回退到系统界面模式: ${backgroundResult.errorMessage}');
      return await sendSmsWithSystemIntent(
        phoneNumber: phoneNumber,
        message: message,
      );
    }

    // 不允许回退，返回后台发送的失败结果
    return backgroundResult;
  }

  /// 检查是否可以使用后台发送模式
  ///
  /// 返回值：true表示有SEND_SMS权限，可以后台发送
  Future<bool> canSendBackground() async {
    return await SmsPermissions.hasSmsSendPermission();
  }

  /// 检查设备是否支持短信功能
  ///
  /// 返回值：true表示设备支持短信功能
  Future<bool> isSmsAvailable() async {
    try {
      final bool result = await _channel.invokeMethod('isSmsAvailable');
      return result;
    } catch (e) {
      print('检查短信功能可用性时发生错误: $e');
      return false;
    }
  }

  /// 获取默认短信应用包名
  ///
  /// 返回值：默认短信应用的包名，如果获取失败返回null
  Future<String?> getDefaultSmsApp() async {
    try {
      final String? result = await _channel.invokeMethod('getDefaultSmsApp');
      return result;
    } catch (e) {
      print('获取默认短信应用时发生错误: $e');
      return null;
    }
  }
}
